import json
import logging
import textwrap
import time

from langchain_text_splitters import RecursiveCharacterTextSplitter

from message_management.case_utils.document_case import CaseDocument
# from myApp.utils.FuZiModel import model, tokenizer, run_fuzi
# from myApp.utils.ChatGlmModel import run_glm
from utils.ApiModel import ollama_chat, fuzi_chat, fuzi_stop, ollama_chat_all

# from utils.ChatGlmModel import run_glm_all, run_glm
from utils.model_api import ModelAPI

task_1_prompt = """
请基于Elasticsearch检索的需求，分析提供的案件描述，并完成以下任务：

1. 确定案件描述中的主要争议焦点。
2. 提取案件描述中的核心事实。
3. 列出与案件描述内容相关的关键词。

案件描述内容：
[@用户输入@]

请根据上述指示，输出以下信息，仅以JSON格式，确保输出结构清晰且信息完整：

{
  "DisputeFocus": "在此填入文本中的主要争议焦点，用一句话清晰表达",
  "CoreFacts": "在此总结文本中描述的核心事实，尽量用简洁的语言表达。",
  "Keywords": [
    "关键词1",
    "关键词2",
    // 根据文本内容添加更多关键词，确保关键词与案件相关且具有辅助检索的价值"
  ]
}

请注意：输出仅限JSON格式，不包含其他任何解释或文本内容，json中必须包含这三个属性：DisputeFocus、CoreFacts、Keywords。
"""

task_1_text = """
- 根据您提供的信息，本案主要争议焦点为：`@DisputeFocus@`
    
- 案件描述中的核心事实为：`@CoreFacts@`
    
- 与案件描述内容相关的关键词有：`@Keywords@`

"""

task_2_prompt = """
请阅读以下两个司法案例的描述，并简要分析它们之间的主要相似点和差异点。专注于案例的法律背景、涉及的当事人、事件地点和时间、以及判决结果等关键方面。

案例A：
[@用户输入@]

案例B：
[@检索事件@]

你必须使用下面所示的格式列出相似点和差异点，具体格式如下，必须使用下面的markdown格式：

- **相似点**：
    - 相似点1
    - 相似点2
    - ...

- **差异点**：
    - 差异点1
    - 差异点2
    - ...
分析条件：
1.分析的结果简洁明了，直接列出关键对比点，无需详细描述。
2.从事实依据、法律角度出发，突出案例之间的异同。
"""

task_2_prompt_splitter = """
用三句话概括三引号内的文本，100字以内。总结不要包含英文。
\"\"\"@案件文档@\"\"\"
"""

llm = ModelAPI()


def is_json(myjson):
    try:
        json_object = json.loads(myjson)
    except json.JSONDecodeError:  # 对于Python3.6及之后的版本，使用json.JSONDecodeError
        return False
    except ValueError as e:  # 对于Python3.5及之前的版本，使用ValueError
        return False
    return True


def case_model(text):
    # llm输出json格式的总结，可能会有错误（不是json、缺少字段），需要重复请求
    global task_1_response, keywords, dispute_focus, keywords_string, core_facts
    while True:
        try:
            task_1_response = llm.chat(task_1_prompt.replace("@用户输入@", text))

            # task_1_response = run_glm_all(task_1_prompt.replace("@用户输入@", text), assistant_message_id, model_name)
            task_1_response = task_1_response.replace("```json", "").replace("```", "")
            # print(task_1_response)
            if not is_json(task_1_response):
                print("不是json")
                continue
            task_1_json = json.loads(task_1_response)
            dispute_focus = task_1_json["DisputeFocus"]
            core_facts = task_1_json["CoreFacts"]
            keywords = task_1_json["Keywords"]
            response = task_1_text.replace("@DisputeFocus@", dispute_focus).replace("@CoreFacts@", core_facts).replace(
                "@Keywords@",
                "" + "、".join(keywords) + "")
            yield json.dumps({'text': response}) + "&&##&&"
            break
        except Exception as e:
            print("出现错误")
            # 输出错误
            print(e)
            continue
    task_1_response = json.loads(task_1_response)
    case_page_info, _ = CaseDocument.search_page(task_1_response, 1, 2, 1)
    i = 1
    try:
        for case_info in case_page_info:
            task_2_docs = textwrap.wrap(case_info.full_text, 10000)
            task_2_array = []

            keywords_string = "/".join(keywords)

            # todo 分段总结
            # for doc in task_2_docs:
            #     res = llm.chat(task_2_prompt_splitter.replace("@案件文档@", doc))
            #     task_2_array.append(res)
            # task_2_prompt_1 = task_2_prompt.replace("@检索事件@", "。".join(task_2_array)).replace("@用户输入@", text)

            flag = 0

            logging.info(f"case_page_info: {case_page_info}")

            task_2_prompt_1 = task_2_prompt.replace("@检索事件@", case_info.full_text).replace("@用户输入@", text)
            logging.info(f"task_2_prompt_1: {task_2_prompt_1}")

            for data in llm.chat_stream(messages=task_2_prompt_1):
                if flag == 0:
                    yield json.dumps({
                        'text': f"### [{i}. {case_info.case_name}](caseDetail?"
                                f"caseId={case_info.id})\n"}) + "&&##&&"
                    flag = 1
                yield data  # 直接传递 run_glm 生成的每个字节流项
            #     分割案例
            yield json.dumps({'text': "\n\n"}) + "&&##&&"
            i += 1
            # 显示3个案例
            if i == 3:
                break
    except json.JSONDecodeError as e:
        logging.error(f"Error decoding JSON: {str(e)}")
        raise
    except Exception as e:
        logging.error(f"Error in case_model: {str(e)}")
        raise
    # 更多案例
    yield json.dumps({
        'text': f"\n\n[更多案例 >](searchCase?"
                f"DisputeFocus={dispute_focus}&CoreFacts={core_facts}"
                f"&Keywords={keywords_string})\n"}) + "&&##&&"
